/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.osiris.persistence.controllers.impl;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import org.osiris.persistence.Impactocambio;
import org.osiris.persistence.Requisito;
import org.osiris.persistence.Peticioncambio;
import org.osiris.persistence.Usuario;
import java.util.ArrayList;

import org.osiris.persistence.controllers.ImpactoInterface;
import org.osiris.persistence.controllers.exceptions.IllegalOrphanException;
import org.osiris.persistence.controllers.exceptions.NonexistentEntityException;
import org.osiris.persistence.controllers.exceptions.PreexistingEntityException;

/**
 *
 * @author amartinez
 */
public class ImpactocambioJpaController implements ImpactoInterface {

    public ImpactocambioJpaController() {
    	emf = CreadorPU.getEntityManagerFactory();
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(Impactocambio impactocambio) throws IllegalOrphanException, PreexistingEntityException, Exception {
        List<String> illegalOrphanMessages = null;
        Peticioncambio peticioncambioOrphanCheck = impactocambio.getPeticioncambio();
        if (peticioncambioOrphanCheck != null) {
            Impactocambio oldImpactocambioOfPeticioncambio = peticioncambioOrphanCheck.getImpactocambio();
            if (oldImpactocambioOfPeticioncambio != null) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("The Peticioncambio " + peticioncambioOrphanCheck + " already has an item of type Impactocambio whose peticioncambio column cannot be null. Please make another selection for the peticioncambio field.");
            }
        }
        if (illegalOrphanMessages != null) {
            throw new IllegalOrphanException(illegalOrphanMessages);
        }
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Requisito idRequisito = impactocambio.getIdRequisito();
            if (idRequisito != null) {
                idRequisito = em.getReference(idRequisito.getClass(), idRequisito.getIdRequisito());
                impactocambio.setIdRequisito(idRequisito);
            }
            Peticioncambio peticioncambio = impactocambio.getPeticioncambio();
            if (peticioncambio != null) {
                peticioncambio = em.getReference(peticioncambio.getClass(), peticioncambio.getIdPeticion());
                impactocambio.setPeticioncambio(peticioncambio);
            }
            Usuario idUsuarioalta = impactocambio.getIdUsuarioalta();
            if (idUsuarioalta != null) {
                idUsuarioalta = em.getReference(idUsuarioalta.getClass(), idUsuarioalta.getIdUsuario());
                impactocambio.setIdUsuarioalta(idUsuarioalta);
            }
            em.persist(impactocambio);
            if (idRequisito != null) {
                idRequisito.getImpactocambioList().add(impactocambio);
                idRequisito = em.merge(idRequisito);
            }
            if (peticioncambio != null) {
                peticioncambio.setImpactocambio(impactocambio);
                peticioncambio = em.merge(peticioncambio);
            }
            if (idUsuarioalta != null) {
                idUsuarioalta.getImpactocambioList().add(impactocambio);
                idUsuarioalta = em.merge(idUsuarioalta);
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            if (findImpactocambio(impactocambio.getIdPeticion()) != null) {
                throw new PreexistingEntityException("Impactocambio " + impactocambio + " already exists.", ex);
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(Impactocambio impactocambio) throws IllegalOrphanException, NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Impactocambio persistentImpactocambio = em.find(Impactocambio.class, impactocambio.getIdPeticion());
            Requisito idRequisitoOld = persistentImpactocambio.getIdRequisito();
            Requisito idRequisitoNew = impactocambio.getIdRequisito();
            Peticioncambio peticioncambioOld = persistentImpactocambio.getPeticioncambio();
            Peticioncambio peticioncambioNew = impactocambio.getPeticioncambio();
            Usuario idUsuarioaltaOld = persistentImpactocambio.getIdUsuarioalta();
            Usuario idUsuarioaltaNew = impactocambio.getIdUsuarioalta();
            List<String> illegalOrphanMessages = null;
            if (peticioncambioNew != null && !peticioncambioNew.equals(peticioncambioOld)) {
                Impactocambio oldImpactocambioOfPeticioncambio = peticioncambioNew.getImpactocambio();
                if (oldImpactocambioOfPeticioncambio != null) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("The Peticioncambio " + peticioncambioNew + " already has an item of type Impactocambio whose peticioncambio column cannot be null. Please make another selection for the peticioncambio field.");
                }
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            if (idRequisitoNew != null) {
                idRequisitoNew = em.getReference(idRequisitoNew.getClass(), idRequisitoNew.getIdRequisito());
                impactocambio.setIdRequisito(idRequisitoNew);
            }
            if (peticioncambioNew != null) {
                peticioncambioNew = em.getReference(peticioncambioNew.getClass(), peticioncambioNew.getIdPeticion());
                impactocambio.setPeticioncambio(peticioncambioNew);
            }
            if (idUsuarioaltaNew != null) {
                idUsuarioaltaNew = em.getReference(idUsuarioaltaNew.getClass(), idUsuarioaltaNew.getIdUsuario());
                impactocambio.setIdUsuarioalta(idUsuarioaltaNew);
            }
            impactocambio = em.merge(impactocambio);
            if (idRequisitoOld != null && !idRequisitoOld.equals(idRequisitoNew)) {
                idRequisitoOld.getImpactocambioList().remove(impactocambio);
                idRequisitoOld = em.merge(idRequisitoOld);
            }
            if (idRequisitoNew != null && !idRequisitoNew.equals(idRequisitoOld)) {
                idRequisitoNew.getImpactocambioList().add(impactocambio);
                idRequisitoNew = em.merge(idRequisitoNew);
            }
            if (peticioncambioOld != null && !peticioncambioOld.equals(peticioncambioNew)) {
                peticioncambioOld.setImpactocambio(null);
                peticioncambioOld = em.merge(peticioncambioOld);
            }
            if (peticioncambioNew != null && !peticioncambioNew.equals(peticioncambioOld)) {
                peticioncambioNew.setImpactocambio(impactocambio);
                peticioncambioNew = em.merge(peticioncambioNew);
            }
            if (idUsuarioaltaOld != null && !idUsuarioaltaOld.equals(idUsuarioaltaNew)) {
                idUsuarioaltaOld.getImpactocambioList().remove(impactocambio);
                idUsuarioaltaOld = em.merge(idUsuarioaltaOld);
            }
            if (idUsuarioaltaNew != null && !idUsuarioaltaNew.equals(idUsuarioaltaOld)) {
                idUsuarioaltaNew.getImpactocambioList().add(impactocambio);
                idUsuarioaltaNew = em.merge(idUsuarioaltaNew);
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Long id = impactocambio.getIdPeticion();
                if (findImpactocambio(id) == null) {
                    throw new NonexistentEntityException("The impactocambio with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(Long id) throws NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Impactocambio impactocambio;
            try {
                impactocambio = em.getReference(Impactocambio.class, id);
                impactocambio.getIdPeticion();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The impactocambio with id " + id + " no longer exists.", enfe);
            }
            Requisito idRequisito = impactocambio.getIdRequisito();
            if (idRequisito != null) {
                idRequisito.getImpactocambioList().remove(impactocambio);
                idRequisito = em.merge(idRequisito);
            }
            Peticioncambio peticioncambio = impactocambio.getPeticioncambio();
            if (peticioncambio != null) {
                peticioncambio.setImpactocambio(null);
                peticioncambio = em.merge(peticioncambio);
            }
            Usuario idUsuarioalta = impactocambio.getIdUsuarioalta();
            if (idUsuarioalta != null) {
                idUsuarioalta.getImpactocambioList().remove(impactocambio);
                idUsuarioalta = em.merge(idUsuarioalta);
            }
            em.remove(impactocambio);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<Impactocambio> findImpactocambioEntities() {
        return findImpactocambioEntities(true, -1, -1);
    }

    public List<Impactocambio> findImpactocambioEntities(int maxResults, int firstResult) {
        return findImpactocambioEntities(false, maxResults, firstResult);
    }

    private List<Impactocambio> findImpactocambioEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("select object(o) from Impactocambio as o");
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public Impactocambio findImpactocambio(Long id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Impactocambio.class, id);
        } finally {
            em.close();
        }
    }

    public int getImpactocambioCount() {
        EntityManager em = getEntityManager();
        try {
            return ((Long) em.createQuery("select count(o) from Impactocambio as o").getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }

}
